def fun1(a, b):
    return a + b


print(fun1(3, 5))

fun2 = lambda a, b: a + b
print(fun2(4, 8))

# lambma只能有一个返回值，若要返回多个元素，可以用元组
# fun3=lambda  a,b:a,b
fun3 = lambda a, b: (a, b)
print(fun3(3, 9))

sum1 = lambda a, b: a + b
print(sum1(2, 3))

# 默认参数
sum2 = lambda a, b, c=100: a + b + c
print(sum2(20, 30))
print(sum2(20, 30, 200))

# 可变参数 一个星号，返回元祖
fn1 = lambda *args: args
print(fn1(2, 3, 5))

# 可变参数，2个星号，返回字典
fn2 = lambda **kwargs: kwargs
print(fn2(name='tom', age=18))

max1 = lambda a, b: a if a >= b else b
print(f'较大值是:{max1(3, 5)}')

students = [
    {'name': 'TOM', 'age': 20}
]

# 列表的sort()方法，传入2个参数：key：按哪个关键字排序 reverse：升序或降序排序(bool)
# 默认是升序，即reverse默认是False：若要降序排，则reverse=True
# 改变了原来的列表

students.sort(key=lambda x: x['name'])
print(students)
# sorted() ，类似于列表的sort（），它不会改变原来列表
print(sorted(students, key=lambda x: x['age'], reverse=True))
print(students)

dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 3, 'f': 1, 'g': 7}
# 按value升序排列
sorted(dict1.items(), key=lambda item: item[1], reverse=True)
# 先按value排，value一样的话按可以排
sorted(dict1.items(), key=lambda item: (item[1], item[0]))


def sum1(a, b, fn):
    return fn(a) + fn(b)


result = sum1(-1, 2, abs)
print(result)

list1 = [1, 2, 3, 4, 5]
# 推导式
li1 = [i ** 2 for i in list1]
print(li1)

result1 = map(lambda a: a ** 2, list1)
print(list(result1))

result2 = map(lambda a: a * a if a % 2 == 0 else a, list1)
print(list(result2))
li2 = [i ** 2 if i % 2 == 0 else i for i in list1]
print(li2)

list2 = [1, 2, 3, 4, 5]
r3 = reduce(lambda a, b: a + b, list2)
print(r3)
